package com.example.chat.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Jackson JSON 配置类
 * 
 * 该配置类负责自定义 Spring 应用中的 Jackson JSON 序列化和反序列化行为。
 * Jackson 是 Spring 默认的 JSON 处理库，用于在 Java 对象和 JSON 格式之间进行转换。
 * 在 WebSocket、REST API 以及其他需要 JSON 交互的场景中，此配置非常重要。
 */
@Configuration
public class JacksonConfig {
    
    /**
     * 创建并配置 ObjectMapper 实例
     * 
     * ObjectMapper 是 Jackson 库的核心类，负责所有的 JSON 转换操作。
     * 该方法创建一个定制的 ObjectMapper 实例，添加了以下配置：
     * 
     * 1. JavaTimeModule：添加对 Java 8 日期时间类型（如 LocalDateTime, ZonedDateTime 等）的支持
     * 2. 禁用 WRITE_DATES_AS_TIMESTAMPS：确保日期时间以 ISO-8601 标准格式序列化，而不是时间戳
     * 3. 禁用 FAIL_ON_UNKNOWN_PROPERTIES：提高反序列化的鲁棒性，忽略 JSON 中存在但 Java 对象中不存在的属性
     * 
     * 该配置对于聊天模块尤为重要，因为：
     * - 消息传输包含复杂的时间戳数据
     * - WebSocket 连接需要处理多种格式的 JSON 消息
     * - 客户端和服务器版本可能不同步，需要容忍额外的属性
     * 
     * @return 配置好的 ObjectMapper 实例，会被 Spring 自动注入到需要的组件中
     */
    @Bean
    public ObjectMapper objectMapper() {
        return JsonMapper.builder()
                .addModule(new JavaTimeModule())
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
                .build();
    }
} 